const proxy = require('./proxy')

// 路由表
const routes = {}

/**
 * 添加路由(存在将会覆盖)
 * @param {Number} port 端口
 * @param {String} path 路径
 * @param {String} url 目标地址
 * @param {Request.method} method 请求方式
 */
function routeAdd(port, path, url, method) {
    if (!routes[port]) routes[port] = {}
    if (!routes[port][path]) routes[port][path] = {}
    routes[port][path][method] = url
}

/**
 * 删除路由
 * @param {Number} port 端口
 * @param {String} path 路径 (可选，如不传会删除整个port下的route)
 * @param {String} method 请求方式 (可选，如不传会直接删除整个path下的route)
 */
function routeDel(port, path, method) {
    if (path) {
        if (routes[port] && routes[port][path]) {
            if (method) {
                delete routes[port][path][method]
                if (Object.keys(routes[port][path]).length == 0) delete routes[port][path]
            } else {
                delete routes[port][path]
            }
        }
    } else {
        delete routes[port]
    }
}

/**
 * 删除所有路由
 */
function routeDelAll() {
    for (const port in routes) {
        delete routes[port]
    }
}

/**
 * 初始路由表
 * @param {Routes} data 路由表
 */
function routeInit(data) {
    for (const key in data) routes[key] = data[key]
}

/**
 * 创建路由器
 * @param {Requests} req 请求对象
 * @param {Response} res 返回请求对象
 * @param {Number} port 端口
 */
function router(req, res, port) {
    if (routes[port]) {
        // 配置单次代理请求
        const method = req.method
        let path = req.url.split('?')[0]

        // 检索 “路由规则” 符合 "路径" 的集合
        let a = []
        for (const r in routes[port]) {
            if (findResult(path, r)) a.push(r)
        }

        // 提取最长的 “路由规则”
        let route = '*'
        for (const i of a) {
            if (i.length > route.length) route = i
        }

        if (routes[port][route]) {
            const opt = { target: routes[port][route][method] ? routes[port][route][method] : routes[port][route]['*'] }
            console.log('[ proxy.web ] >', opt)

            // 发送一次代理请求（不设置options，使用整个代理服务配置）
            proxy.web(req, res, opt, (e) => {
                console.log('[ Error proxy.web ]', e)
            })
        } else {
            res.end('请在 mproxy 配置合适规则!')
        }
    } else {
        res.end('感谢使用 mproxy !')
    }
}

/**
 * 检索路径是否符合路由规则
 * @param {String} path 路径
 * @param {String} route 路由规则
 * @returns 
 */
function findResult(path, route) {
    const pathArr = path.split('/')
    const routeArr = route.split('/')
    let result = true;
    for (const i in routeArr) {
        if (pathArr[i] !== undefined && (routeArr[i] === pathArr[i] || routeArr[i] === '*')) {
            if (i == routeArr.length - 1 && routeArr[i] === '*') break
        } else {
            result = false
            break
        }
    }
    return result
}

module.exports = { routeInit, router, routeAdd, routeDel, routeDelAll, routes }
